package com.aograph.entity;

import java.text.SimpleDateFormat;
import java.time.Duration;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.*;

/**
 * ┏┓　　　┏┓
 * ┏┛┻━━━┛┻┓
 * ┃　　　　　　　┃
 * ┃　　　━　　　┃
 * ┃　┳┛　┗┳　┃
 * ┃　　　　　　　┃
 * ┃　　　┻　　　┃
 * ┃　　　　　　　┃
 * ┗━┓　　　┏━┛
 * 　　┃　　　┃神兽保佑
 * 　　┃　　　┃代码无BUG！
 * 　　┃　　　┗━━━┓
 * 　　┃　　　　　　　┣┓
 * 　　┃　　　　　　　┏┛
 * 　　┗┓┓┏━┳┓┏┛
 * 　　　┃┫┫　┃┫┫
 * 　　　┗┻┛　┗┻┛
 *
 * @author lelezhang
 * @description
 * @create 2021/12/16
 **/
public class Utils {
    /**
     * 获取航班最低价
     * @param discountCabinList
     * @return
     */
    private static SimpleDateFormat sdf =new SimpleDateFormat("yyyy-MM-dd");
    private static List<String> LOWER_AIRLINE=Arrays.asList("9C","JD","GS","KN","8L","PN","AQ","GX","FU","UQ","GT","9H","Y8");

    public static Double getLowerPrice(List<DiscountCabin> discountCabinList,AirlinePredict ap){
        try {
            DiscountCabin cabin1 = discountCabinList.stream()
                    .filter(dc -> dc.getDeparture_3code().equals(ap.getDep()))
                    .filter(dc -> dc.getArrival_3code().equals(ap.getArr()))
                    .filter(dc -> dc.getFltno().equals(ap.getFltno()))
                    .filter(dc -> dc.getFlight_date_start().before(ap.getFlight_date())
                            || (sdf.format(dc.getFlight_date_start()).equals(sdf.format(ap.getFlight_date()))))
                    .filter(dc -> dc.getFlight_date_end().after(ap.getFlight_date())
                            || (sdf.format(dc.getFlight_date_end()).equals(sdf.format(ap.getFlight_date()))))
                    .sorted((e1, e2) -> {
                        return e1.getOw_price().compareTo(e2.getOw_price());
                    }).findFirst().orElse(null);
            if (null != cabin1) {
                return cabin1.getOw_price();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
        return ap.getStd_price()*0.3;
    }

    /**
     * 判断字符串是否相等
     * @param str1
     * @param str2
     * @return
     */
    public static boolean stringEquals (String str1,String str2){
        if(null==str1 || null==str2) return false;
        if(!str1.equals(str2)) return false;
        return true;
    }

    //计算两个时间差,第一个参数早于第二个，为正值
    public static long durationMinutes(String deptime1,String deptime2){
        if (deptime1==null || deptime1=="") return 0;
        if (deptime2==null || deptime2=="") return 0;
        String date= LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        LocalDateTime start =LocalDateTime.parse(date+" "+deptime1, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
        LocalDateTime end =LocalDateTime.parse(date+" "+deptime2, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
        return Duration.between(start,end).toMinutes();
    }

    /**
     * 计算起飞时间分值
     */
    public static  int get_time_score(String flt_time){
        if(flt_time ==null || flt_time ==""){
            return -1;
        }
        String date= LocalDate.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd"));
        LocalDateTime dateTime = LocalDateTime.parse(date+" "+flt_time, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
        int time_score=4;
        int hour=dateTime.getHour();
        int minute=dateTime.getMinute();
        if (hour==10){
            if (minute < 30){
                time_score = 2;
            }else{
                time_score = 1;
            }
        }
        if (hour >= 11 && hour <= 17){
            time_score = 1;
        }
        if (hour == 9 || (hour >= 18 && hour <= 19)){
            time_score = 2;
        }
        if (hour == 8 || (hour >= 20 && hour <= 22)){
            time_score = 3;
        }
        return 5-time_score;
    }

    /**
     * 判断起飞时间是否在一个范围内
     * @param time
     * @param _start
     * @param _end
     * @return
     */
    public static boolean time_between(String time,String _start,String _end){
        if (time==null || time=="") return false;
        if (_start==null || _start=="") return false;
        if (_end==null || _end=="") return false;
        if (time.compareTo(_start)>=0 && time.compareTo(_end)<=0) return true;
        return false;
    }

    /**
     * 判断起飞时间是否在一个时间之前
     * @param time
     * @param _start
     * @return
     */
    public static boolean time_before(String time,String _start){
        if (time==null || time=="") return false;
        if (_start==null || _start=="") return false;
        if (time.compareTo(_start)<0) return true;
        return false;
    }

    /**
     * 判断起飞时间是否在一个时间之后
     * @param time
     * @param _end
     * @return
     */
    public static boolean time_after(String time,String _end){
        if (time==null || time=="") return false;
        if (_end==null || _end=="") return false;
        if (time.compareTo(_end)>0) return true;
        return false;
    }

    /**
     * 是否低成本航班
      * @param airline_code
     * @return
     */
    public static boolean isLowerCostAirline(String airline_code){
        if (airline_code==null || airline_code=="") return false;
        return LOWER_AIRLINE.contains(airline_code);
    }

    /**
     * 涉及独飞航线，以下日期，D15-D60预测，在原开舱基础上提一折
     * 4月2日、3日、5日、6日
     * 4月28日、29日、30日、5月1日、4日、5日
     * 6月2日、3日、5日、6日
     */
    public static List<String> holidays=Arrays.asList("04-02","04-03","04-05","04-06","04-28","04-29","04-30",
                                                      "05-01","05-04","05-05","06-02","06-03","06-05","06-06");

    public static boolean checkHoliday(java.util.Date flight_date){
        SimpleDateFormat sdf=new SimpleDateFormat("MM-dd");
        String _flight_date=sdf.format(flight_date);
        if (holidays.contains(_flight_date)) return true;
        return false;
    }


    /**
     * Date转LocalDate
     * @param date
     */
    public static LocalDate date2LocalDate(Date date) {
        if(null == date) {
            return null;
        }
        return date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
    }

    /**
     * 排序
     * @param list
     */
    public static ArrayList  sortAsc(ArrayList list){
        if(null!=list){
            Collections.sort(list, new Comparator() {
                @Override
                public int compare(Object o1, Object o2) {
                    if (o1 instanceof AirlinePredict && o2 instanceof AirlinePredict){
                        LocalDate start_date=date2LocalDate(((AirlinePredict)o1).getFlight_date());
                        LocalDate end_date=date2LocalDate(((AirlinePredict)o2).getFlight_date());
                        return new Long(start_date.toEpochDay()-end_date.toEpochDay()).intValue();
                    }
                    return 0;
                }
            });
        }
        return list;
    }

}
